lisp学习笔记
lisp学习笔记
lisp的程序结构
LISP表达式称为符号表达式或S-表达式。s表达式是由三个有效对象,原子,列表和字符串。
任意的s-表达式是一个有效的程序。
Lisp程序在解释器或编译的代码运行。
lisp基本语法
基本数据
程序由三个基本的数据构成:atom,list,string
atom:
为一个数字连续字符或连续的字符串,包括数字和特殊字符。
hello-from-tutorials-yiibai
name
123008907
hello
Block#221
list:
广义表
( i am a list)
(a ( a b c) d e fgh)
(father tom ( susan bill joe))
(sun mon tue wed thur fri sat)
string:
一组括在双引号内的字符
“ I am a string”
“a ba c d efg #$%^&!”
“Please enter the following details :”
“Hello from ‘Tutorials Yiibai’! “
添加注释: 使用;
quote函数
lisp 的 symbol-expression 可以是原子 或 列表。
列表由 原子 和 列表组成。
如果不用 quote (‘), 那么列表的第一元素是函数, 对后续元素求值,并作为参数。
如果使用 quote(‘), 那么对于列表而言,就是返回列表,不求值,而且它的所有元素都不求值. 例如 ‘(+ 2 3) 就返回 (+ 2 3), ‘(+ (- 10 5) 2) 返回 (+ (- 10 5) 2)
对于原子 ‘a, 也是返回 a, 不对a求值。
set函数和setq函数
在Lisp中,如果我们希望对一个变量赋值,可以使用set函数,用法如下:
1 | (set ‘my-value "my string") |
上面的代码是对变量my-value进行赋值,值是”my String”。注意其中的‘my-value前面是有一个单引号的。
我们知道,在Lisp中,‘my-value其实是(quote my-value)的简写,所以上面的set函数代码也可以写成这样:
1 | (set (quote my-value) "my string") |
不过,因为set函数使用的次数很多,每次都要使用quote或者在变量名前加一个单引号比较麻烦,于是发展了setq函数,setq中的q字母就是代表quote的意思,使用setq函数就可以这样写了:
1 | (setq my-value "my string") |
如果只是这样使用,可以认为set和setq是没有差别的,只是格式简化了。
但是,事实上setq比set函数要高级一些,setq函数还可以同时对多个变量进行赋值,像下面这样:
1 | (setq my-value1 "my string 1" my-value2 "my string 2") |
上面的代码同时对变量my-value1和my-value2进行赋值。而set函数就不能这样使用了。
需要注意的点
在LISP语言的基本数学运算是 +, -, *, 和 /
Lisp实际上是一个函数调用f(x)为 (f x),例如 cos(45)被写入为 cos 45
LISP表达式是不区分大小写的,cos 45 或COS 45是相同的。
LISP尝试计算一切,包括函数的参数。只有三种类型的元素是常数,总是返回自己的值:
数字
字母t,即表示逻辑真
该值为nil,这表示逻辑false,还有一个空的列表。